/* 
多态: 多种形态
*/

(function () {
  class Animal {
    name: string
    
    constructor (name: string) {
      this.name = name
    }

    run (distance: number=0) {
      console.log(`${this.name} run ${distance}m`)
    }

  }

  class Snake extends Animal {
    constructor (name: string) {
      // 调用父类型构造方法
      super(name)
    }

    // 重写父类型的方法
    run (distance: number=5) {
      console.log('sliding...', distance)
      // super.run(distance)
    }
  }

  class Horse extends Animal {
    // constructor (name: string) {
    //   // 调用父类型构造方法
    //   super(name)
    // }

    // 重写父类型的方法
    run (distance: number=50) {
      console.log('dashing...', distance)
      // 调用父类型的一般方法
      // super.run(distance)
    }

    xxx () {
      console.log('xxx()')
    }
  }

  const a1: Animal = new Animal('a1')
  const a2: Animal = new Snake('a2')
  const a3: Animal = new Horse('a3')  // 父类引用指向子类对象

  function fn(a: Animal) {  // 多态: 多种形态 => a可以是Animal对象, 也可以它任意子类型对象
    a.run()
  }

  fn(new Animal('aaa'))
  fn(new Snake('bbb'))
  fn(new Horse('ccc'))
  
})()